星巡研究院

渗透视角下的C语言

``` #include <sys/select.h> fd_set rfds; FD_ZERO(&rfds); FD_SET(sockfd, &rfds); struct timeval tv = { 1, 0 }; /* 1秒超时,循环里需重置 */ int n = select(sockfd + 1, &rfds, NULL, NULL, &tv); /* rax=23,返回就绪数 */ if (n < 0) { perror("select"); } else if (n == 0) { /* 超时,无就绪 */ } else if (FD_ISSET(sockfd, &rfds)) { /* 返回后位图被改写,再逐位检测 */ /* 该描述符可读 */ } ``` 链路:`select()` → glibc 置 `rax=23`(或经 `pselect6=270`),`rdi=nfds`、`rsi/rdx/r10` 指向三组位图、`r8=&timeval` → 陷入后内核按最高描述符扫描位图、把就绪位回填 → 返回就绪总数。位图在调用中被改
这是进阶内容

升级理论包获取本册全部章节,从机器本质系统入门